package rs.thread.processor;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentLinkedQueue;

import rs.parser.FriendParser;
import rs.parser.NeighboursParser;
import rs.thread.OnerousProcessor;
import rs.util.Requester;
import rs.util.TuningParameters;

/* Classe che, dato un utente, ne recupera gli amici. */
public class UserProcessor implements OnerousProcessor<String> {
	
	private ConcurrentLinkedQueue<String> users;
	private FriendParser friend_parser;
	private NeighboursParser neighbours_parser;
	
	public UserProcessor() {
		this.users = new ConcurrentLinkedQueue<String>();
		this.friend_parser = new FriendParser();
		this.neighbours_parser = new NeighboursParser();
	}
	
	@Override
	public void onerousFunction(Requester app, String user) {
		String url = 
				"http://ws.audioscrobbler.com/2.0/?" +
				"method=user.getfriends&" +
				"limit=" + TuningParameters.MAX_USERS + "&" +
				"user=" + user + "&" +
				"api_key=8cfeab56c4060f4c3b983902e3903a80&" +
				"format=json";
		String response = app.send(url);
		List<String> friends = this.friend_parser.parse(response);
		this.users.addAll(friends);
		
		/* Può capitare di avere un utente che non ha amici o che ne ha pochi.
		 * In questi casi viene chiesto a Last.fm di restituire utenti simili a questo.
		 * In tal modo si hanno comunque un certo numero di utenti su cui fare la valutazione.
		 * Inoltre, siccome sono simili all'utente, c'è un'alta probabilità che abbiano gusti in comune (il che rafforza l'efficacia della raccomandazione).
		 * Tuttavia, anche nel caso in cui l'utente abbia abbastanza amici, viene comunque scelto un utente sconosciuto, nel tentativo di suggerire brani inediti. */
		int neighbour_limit = TuningParameters.MAX_USERS + 1 - friends.size();
		url = 
				"http://ws.audioscrobbler.com/2.0/?" +
				"method=user.getneighbours&" +
				"limit=" + neighbour_limit + "&" +
				"user=" + user + "&" +
				"api_key=8cfeab56c4060f4c3b983902e3903a80&" +
				"format=json";
		response = app.send(url);
		this.users.addAll(this.neighbours_parser.parse(response));	
	}
	
	public List<String> getResult() {
		return new ArrayList<String>(this.users);
	}
	
}